import javassist.CannotCompileException; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.NotFoundException; import javassist.expr.ExprEditor; import javassist.expr.MethodCall; public class Jassist150 { public static final String BASE_PATH = "./"; public static final String JAVASSIST_JAR = BASE_PATH + "javassist.jar"; public static final String CLASSES_FOLDER = BASE_PATH + "build/classes"; public static final String TEST_CLASSES_FOLDER = BASE_PATH + "build/test-classes"; public static class Inner1 { public static int get() { return 0; } } public static void implTestClassTailCache() throws NotFoundException, CannotCompileException { ClassPool pool = new ClassPool(true); for (int paths = 0; paths < 50; paths++) { pool.appendClassPath(JAVASSIST_JAR); pool.appendClassPath(CLASSES_FOLDER); pool.appendClassPath(TEST_CLASSES_FOLDER); } CtClass cc = pool.get("Jassist150$Inner1"); CtMethod ccGet = cc.getDeclaredMethod("get"); String code1 = "{ int n1 = Integer.valueOf(1); " + " int n2 = Integer.valueOf(2); " + " int n3 = Integer.valueOf(3); " + " int n4 = Integer.valueOf(4); " + " int n5 = Integer.valueOf(5); " + " return n1+n2+n3+n4+n5; }"; String code2 = "{ int n1 = java.lang.Integer.valueOf(1); " + " int n2 = java.lang.Integer.valueOf(2); " + " int n3 = java.lang.Integer.valueOf(3); " + " int n4 = java.lang.Integer.valueOf(4); " + " int n5 = java.lang.Integer.valueOf(5); " + " return n1+n2+n3+n4+n5; }"; String code3 = "{ int n1 = java.lang.Integer#valueOf(1); " + " int n2 = java.lang.Integer#valueOf(2); " + " int n3 = java.lang.Integer#valueOf(3); " + " int n4 = java.lang.Integer#valueOf(4); " + " int n5 = java.lang.Integer#valueOf(5); " + " return n1+n2+n3+n4+n5; }"; loop(cc, ccGet, code1); } public static void loop(CtClass cc, CtMethod ccGet, String code) throws CannotCompileException { long startTime = System.currentTimeMillis(); for (int replace = 0; replace < 1000; replace++) { ccGet.setBody(code); } long endTime = System.currentTimeMillis(); System.out.println("Test: Time (ms) " + (endTime - startTime)); } public static void implTestClassTailCache2() throws NotFoundException, CannotCompileException { ClassPool pool = new ClassPool(true); for (int paths = 0; paths < 50; paths++) { pool.appendClassPath(JAVASSIST_JAR); pool.appendClassPath(CLASSES_FOLDER); pool.appendClassPath(TEST_CLASSES_FOLDER); } CtClass cc = pool.get("Jassist150$Inner1"); CtMethod ccGet = cc.getDeclaredMethod("get"); String code3 = "{ int n1 = java.lang.Integer#valueOf(1); " + " int n2 = java.lang.Integer#valueOf(2); " + " int n3 = java.lang.Integer#valueOf(3); " + " int n4 = java.lang.Integer#valueOf(4); " + " int n5 = java.lang.Integer#valueOf(5); " + " return n1+n2+n3+n4+n5; }"; ccGet.setBody(code3); } public void testJIRA152() throws Exception { CtClass cc = ClassPool.getDefault().get("test4.JIRA152"); CtMethod mth = cc.getDeclaredMethod("buildColumnOverride"); mth.instrument(new ExprEditor() { public void edit(MethodCall c) throws CannotCompileException { c.replace("try{ $_ = $proceed($$); } catch (Throwable t) { throw t; }"); } }); mth.getMethodInfo().rebuildStackMap(ClassPool.getDefault()); cc.writeFile(); } public static void main(String[] args) throws Exception { new Jassist150().testJIRA152(); } public static void main2(String[] args) { for (int loop = 0; loop < 5; loop++) { try { implTestClassTailCache(); for (int i = 0; i < 100; i++) implTestClassTailCache2(); } catch (Exception e) { e.printStackTrace(); } } System.out.println("size: " + javassist.compiler.MemberResolver.getInvalidMapSize()); } }